/*
 * DBValidazione
 * 
 * Class that will take care of operations on the DBValidazione
 * 
 * author Luigi di Martino , Carmine Colicino
 * 
 * version 1.0
 */

package it.unisa.udocs.storage;

import it.unisa.udocs.commons.DBConnectionPool;
import it.unisa.udocs.commons.DBNames;
import it.unisa.udocs.data.Prodotto;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.mysql.jdbc.Statement;

public class DBValidazione {

	private static DBValidazione dbValidazione;

	/**
	 * Method that implements the Singleton Design Pattern
	 * 
	 * @return DBValidazione
	 * 
	 */
	public static DBValidazione getInstance() {
		if (dbValidazione == null)
			dbValidazione = new DBValidazione();
		return dbValidazione;
	}
	
	/**
	 * It's used to search for all completed products of a department 
	 * 
	 * @param id_direttore - The Director's id 
	 * 
	 *  @return The list of all product found
	 * 
	 */
	public ArrayList<Prodotto> listaProdottiCompleti(int id_direttore) {
		
		Prodotto prod = null;
		
		ArrayList<Prodotto> listaProdottiCompleti = new ArrayList<Prodotto>();
		
		try {
			//Crea una connessione al DB
			Connection con = DBConnectionPool.getConnection();
			
			//Crea la query di ricerca
			String query = "SELECT * "
					+ "FROM Prodotto JOIN Ricercatore ON "
					+ "Prodotto.proprietario = Ricercatore.id_account "
					+ "WHERE Ricercatore.dipartimento = "
					+ "(SELECT Ricercatore.dipartimento FROM Ricercatore "
					+ "WHERE id_account = " + id_direttore + ")"
					+ " AND stato = 'completo'";
			
			Statement st = (Statement) con.createStatement();

			ResultSet rs = st.executeQuery(query);

			while(rs.next())
			{
				prod = new Prodotto(Integer.parseInt(
						rs.getString(DBNames.PROD_ID)), 
						rs.getString(DBNames.PROD_TIT),
						rs.getString(DBNames.PROD_STATO),
						rs.getString(DBNames.PROD_COD),
						rs.getString(DBNames.PROD_PUBB),
						rs.getString(DBNames.PROD_LING),
						rs.getString(DBNames.PROD_ANNO_PUBB),
						rs.getInt(DBNames.PROD_PROPR),
						rs.getString(DBNames.PROD_URL),
						rs.getString(DBNames.PROD_ABSTRACT),
						rs.getString(DBNames.PROD_AUTORI),
						rs.getString(DBNames.PROD_TIP));
				System.out.println("id: "+prod.getId_prodotto());
				listaProdottiCompleti.add(prod);
			}

			System.out.println("List_Complete_Products created" );

			st.close();
			rs.close();
			DBConnectionPool.releaseConnection(con);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return listaProdottiCompleti;
	}
	
	/**
	 * It's used to search for all products that already had a first acceptance
	 * 
	 * @param id_membro_comitato - The Member of the scientific committee
	 * 
	 *  @return The list of all product found
	 * 
	 */
	public ArrayList<Prodotto> listaProdottiAccettati(int id_membro_comitato) {
		
		Prodotto prod = null;
		
		ArrayList<Prodotto> listaProdottiAccettati = new ArrayList<Prodotto>();
		
		try {
			//Crea una connessione al DB
			Connection con = DBConnectionPool.getConnection();
			
			//Crea la query di ricerca
			String query = "SELECT * "
					+ "FROM Prodotto JOIN Ricercatore "
					+ "ON Prodotto.proprietario = Ricercatore.id_account "
					+ "WHERE Ricercatore.area_scientifica = "
					+ "(SELECT Ricercatore.area_scientifica FROM Ricercatore "
					+ "WHERE id_account = " + id_membro_comitato + ")"
					+ " AND stato = 'accettato'";
			
			System.out.println("Query validazione: " + query);
			Statement st = (Statement) con.createStatement();

			ResultSet rs = st.executeQuery(query);

			while(rs.next())
			{
				prod = new Prodotto(Integer.parseInt(
						rs.getString(DBNames.PROD_ID)), 
						rs.getString(DBNames.PROD_TIT),
						rs.getString(DBNames.PROD_STATO),
						rs.getString(DBNames.PROD_COD),
						rs.getString(DBNames.PROD_PUBB),
						rs.getString(DBNames.PROD_LING),
						rs.getString(DBNames.PROD_ANNO_PUBB),
						rs.getInt(DBNames.PROD_PROPR),
						rs.getString(DBNames.PROD_URL),
						rs.getString(DBNames.PROD_ABSTRACT),
						rs.getString(DBNames.PROD_AUTORI),
						rs.getString(DBNames.PROD_TIP));
				listaProdottiAccettati.add(prod);
			}

			System.out.println("List_Accepted_Products created" );

			st.close();
			rs.close();
			DBConnectionPool.releaseConnection(con);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return listaProdottiAccettati;
	}
	
	/**
	 * Is used to help a Department's Director to accept a list of products 
	 * 
	 * @param id_selezionati - The IDs of all products 
	 * 
	 */
	public void accettaProdotti(ArrayList<Integer> id_selezionati) {
		try {
			//Crea una connessione al DB
			Connection con = DBConnectionPool.getConnection();
			
			PreparedStatement st = null;
			
			for(int i = 0; i < id_selezionati.size(); i++) {
				
				//Crea la query di ricerca
				String query = "UPDATE Prodotto SET stato = 'accettato' "
						+ "WHERE id_prodotto = ?"; 
				
				st = con.prepareStatement(query);
				
				st.setInt(1, id_selezionati.get(i));
				
				st.executeUpdate();
	            con.commit();
			}
			
			st.close();
			DBConnectionPool.releaseConnection(con);
				
			} catch (SQLException e) {
				e.printStackTrace();
			}
		
	}
	
	/**
	 * It's used to help a Department's Director to refuse the acceptance of a list of products
	 * 
	 * @param id_selezionati - The IDs of all products to refuse
	 * 
	 */
	public void rifiutaProdotti(ArrayList<Integer> id_selezionati) {
		try {
			//Crea una connessione al DB
			Connection con = DBConnectionPool.getConnection();
			
			PreparedStatement st = null;
			
			for(int i = 0; i < id_selezionati.size(); i++) {
				
				//Crea la query di ricerca
				String query = "UPDATE Prodotto SET stato = 'draft' "
						+ "WHERE id_prodotto = ?"; 
				
				st = con.prepareStatement(query);
				
				st.setInt(1, id_selezionati.get(i));
				
				st.executeUpdate();
	            con.commit();
			}
			
			st.close();
			DBConnectionPool.releaseConnection(con);
				
			} catch (SQLException e) {
				e.printStackTrace();
			}
		
	}
	
	/**
	 * It's used to validate a list of products 
	 * 
	 * @param id_selezionati - The IDs of all products 
	 * 
	 */
	public void validaProdotti(ArrayList<Integer> id_selezionati) {
		try {
			//Crea una connessione al DB
			Connection con = DBConnectionPool.getConnection();
			
			PreparedStatement st = null;
			
			for(int i = 0; i < id_selezionati.size(); i++) {
				
				//Crea la query di ricerca
				String query = "UPDATE Prodotto SET stato = 'validato' "
						+ "WHERE id_prodotto = ?"; 
				
				st = con.prepareStatement(query);
				
				st.setInt(1, id_selezionati.get(i));
				
				st.executeUpdate();
	            con.commit();
			}
			
			st.close();
			DBConnectionPool.releaseConnection(con);
				
			} catch (SQLException e) {
				e.printStackTrace();
			}
		
	}

	
}
